﻿// Inner Fire 游戏引擎库
// InstancedSpriteObject - 实例精灵对象
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于管理一系列的实例精灵。这东西讲道理来说应该是一个代理的傀儡。
// 因为实例精灵对象以后的项目可能会在GPU中计算变换。
// 所以主体还是应该在DirectX Graphics中。但是放置在这里方便跨平台。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-05-21

#pragma once

#include <dx/mesh/instanced_sprites.h>
#include <game/object/game_object.h>
#include <glm.hpp>

namespace ifire::game {
class Model;

class InstancedSpriteObject : public GameObject {
public:
  InstancedSpriteObject(
      ikit::sstr name, Scene* scene, GameObject* parent = nullptr);
  InstancedSpriteObject(const InstancedSpriteObject& lhs) = delete;
  InstancedSpriteObject& operator=(const InstancedSpriteObject& lhs) = delete;
  ~InstancedSpriteObject() override;

  // IVec3
  void FixedUpdate() override;
  // 设置一个项目的Position
  void SetPosition(int index, IVec3 position);
  // 设置一个项目的Transform
  void SetTransform(
      int index, IVec3 position, IVec4 rotation, IVec3 scale);
  // 设置一个项目的Color
  void SetColor(int index, IVec4 color);
  // 设置一个线段
  void SetLine(int index, IVec3 position, IVec3 end);

  // 设置这个项目最多绘制多少个项目（无法大于初始项目）
  void SetDrawCount(size_t draw_count);
  // 设置刷新
  void SetRefresh();
  // 设置所有项目的缩放
  void SetAllScale(IVec3 scale);
  // 设置所有项目的颜色
  void SetAllColor(IVec4 color, int start = 0, int end = 0);

  //
  // 属性访问
  //
  void SetInstancedSprites(dx::InstancedSprites* pool) { pool_ = pool; }
  void SetMaterial(dx::Material* material) { pool_->SetMaterial(material); };

private:
  // 对于Dx的引用
  dx::InstancedSprites* pool_;
};
} // namespace ifire::game